package com.liuqianfei.markdown;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

import com.liuqianfei.markdown.Configuration.Builder;
import com.sun.webkit.plugin.Plugin;

/**
 * Markdown解析器工具 
 */
public class MarkdownProcessor
{
    private Builder builder;

    private ExtDecorator decorator;

    public MarkdownProcessor()
    {
        this.builder = builder();
    }

    private Builder builder()
    {
        decorator = new ExtDecorator();
        return Configuration.builder().forceExtentedProfile().setDecorator(decorator).setCodeBlockEmitter(new CodeBlockEmitter());
        //.registerPlugins(new YumlPlugin(), new WebSequencePlugin(), new IncludePlugin())
    }

    /**
     * 注册插件
     * 
     * @param plugins 插件
     * @return MD处理器
     */
    // TODO 待扩展
    public MarkdownProcessor registerPlugins(Plugin... plugins)
    {
        //builder.registerPlugins(plugins);
        return this;
    }

    /**
     * 设置装饰器
     * 
     * @param decorator 装饰器
     * @return MD处理器
     */
    public MarkdownProcessor setDecorator(ExtDecorator decorator)
    {
        this.decorator = decorator;
        builder.setDecorator(decorator);
        return this;
    }

    /**
     * （批量）添加标签属性
     * 
     * @param name 属性名称
     * @param value 属性值
     * @param tags 要添加属性的标签名称列表
     * @return MD处理器
     */
    public MarkdownProcessor addHtmlAttribute(String name, String value, String... tags)
    {
        decorator.addHtmlAttribute(name, value, tags);
        return this;
    }

    /**
     * （批量）添加标签样式类
     * 
     * @param styleClass 样式类，可以有多个，用空格分开
     * @param tags 要添加样式类的标签名称列表
     * @return MD处理器
     */
    public MarkdownProcessor addStyleClass(String styleClass, String... tags)
    {
        decorator.addStyleClass(styleClass, tags);
        return this;
    }

    /////////////////////////// 四种解析类型///////////////////////////

    /**
     * 解析MarkDown文件
     * 
     * @param file 要解析的文件
     * @return 解析完成的HTML字符串
     * @throws IOException
     */
    public String process(File file) throws IOException
    {
        return Processor.process(file, builder.build());
    }

    /**
     * 解析MarkDown字节流
     * 
     * @param input 要解析的字节流
     * @return 解析完成的HTML字符串
     * @throws IOException
     */
    public String process(InputStream input) throws IOException
    {
        return Processor.process(input);
    }

    /**
     * 解析MarkDown字符流
     * 
     * @param reader 要解析的字符流
     * @return 解析完成的HTML字符串
     * @throws IOException
     */
    public String process(Reader reader) throws IOException
    {
        return Processor.process(reader, builder.build());
    }

    /**
     * 解析MarkDown字符串
     * 
     * @param input 要解析的字符串
     * @return 解析完成的HTML字符串
     * @throws IOException
     */
    public String process(String input) throws IOException
    {
        return Processor.process(input, builder.build());
    }
}
